﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using PEMS.Common;

namespace PEMS.Server
{
    [Serializable]
    public class Kurzus
    {
        
        public string id { get; set; }
        public string megnevezes { get; set; }
        public Targy targy { get; set; }
        public Oktato oktato { get; set; }
        public int n { get; set; } // segédváltozó az egyedi vizsgaidőpont azonosító létrehozásához

        /// <summary>
        /// 
        /// </summary>
        public SerializableDictionary<string, KurzusTagsag> kurzusTagList { get; set; }

        public SerializableDictionary<string, VizsgaIdopont> vizsgaidopontList { get; set; }

        public Kurzus()
        {
            kurzusTagList = new SerializableDictionary<string, KurzusTagsag>();
            vizsgaidopontList = new SerializableDictionary<string, VizsgaIdopont>();            
        }

        public Kurzus(string id, string megnevezes, Oktato oktato, Targy targy)
        {
            kurzusTagList = new SerializableDictionary<string, KurzusTagsag>();
            vizsgaidopontList = new SerializableDictionary<string, VizsgaIdopont>();
            this.id = id;
            this.megnevezes = megnevezes;
            this.oktato = oktato;
            this.targy = targy;
            n = 10;
        }

        public bool oktatoKurzushozRendelese(Oktato oktato)
        {
            try
            {
                this.oktato = oktato;
            }
            catch
            {
                return false;
            }
            return true;
        }

        public bool kurzusTagja(string hallgatoID)
        {
            try
            {
                if (kurzusTagList.ContainsKey(hallgatoID))
                {
                    return true;
                }
            }
            catch
            {
                return false;
            }
            return false;
        }

        public KurzusTagsag getKurzusTag(string hallgatoID)
        {
            try
            {
                if (kurzusTagList.ContainsKey(hallgatoID))
                {
                    return kurzusTagList[hallgatoID];
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("\nException in getKurzusTag(): " + e.Message + "\n");
                return null;
            }
            return null;
        }

        public bool kurzusJelentkezes(FelevJelentkezes felevJelentkezes)
        {
            try
            {
                KurzusTagsag kurzusTagsag = new KurzusTagsag();
                kurzusTagsag.jelentkezesIdopont = DateTime.Now;
                kurzusTagsag.felevJelentkezes = felevJelentkezes;

                //növeljük a kurzus tárgyának hallgatókat nyilvántartó számlálóját
                if (!targy.felvetelekSzama.ContainsKey(felevJelentkezes.hallgato.userName))
                {
                    targy.felvetelekSzama.Add(felevJelentkezes.hallgato.userName, 1);
                }
                else
                {
                    targy.felvetelekSzama[felevJelentkezes.hallgato.userName]++;
                }
                
                //a kurzustagságot felfűzzük a kurzus tárolójába
                kurzusTagList.Add(felevJelentkezes.hallgato.userName, kurzusTagsag);
            }
            catch
            {
                return false;
            }
            return true;
        }

        public bool vizsgaMeghirdetese(DateTime idopont, int maxLetszam)
        {
            VizsgaIdopont vizsgaIdopont = new VizsgaIdopont(idopont, maxLetszam);

            try
            {
                //a vizsgaidőpontot felfűzzük a kurzus tárolójába                  
                n++;
                vizsgaIdopont.id = this.id + "_" + n.ToString();
                vizsgaidopontList.Add(vizsgaIdopont.id, vizsgaIdopont);
            }
            catch
            {
                return false;
            }
            return true;
        }
                
        public SerializableDictionary<string, VizsgaIdopont> getVizsgaIdopontok()
        {
            return vizsgaidopontList;
        }

        public VizsgaIdopont getVizsgaIdopont(string vizsgaIdopontID)
        {
            VizsgaIdopont v = new VizsgaIdopont();
            v = null;
            try
            {
                foreach (KeyValuePair<string, VizsgaIdopont> vizsgaidopont in vizsgaidopontList)
                {
                    if (vizsgaidopont.Value.id.ToString() == vizsgaIdopontID)
                    {
                        v = vizsgaidopont.Value;
                    }
                }
            }
            catch (Exception e)
            {
                return null;
            }
            return v;
        }
        
    }
}
